package com.mengmablog.blog.utils;

import com.mengmablog.blog.commons.BlogConst;
import com.mengmablog.blog.entity.Articles;
import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.ext.tables.TablesExtension;
import com.vladsch.flexmark.html.HtmlRenderer;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.parser.ParserEmulationProfile;
import com.vladsch.flexmark.util.options.MutableDataSet;
import org.springframework.util.StringUtils;

import java.util.Collections;

/**
 * @Auther: Tangzhiqiang
 * @Date: 2018/12/24 15:08
 * @Description: markdown 语法解析工具类
 */
public class MarkDownUtil {
    /**
     * markdown 扩展设置
     */
    private static final MutableDataSet options = new MutableDataSet();

    static {
        options.setFrom(ParserEmulationProfile.MARKDOWN);
        options.set(Parser.EXTENSIONS, Collections.singletonList(TablesExtension.create()));
    }


    /**
     * markdown 解析器
     */
    private static final Parser PARSER = Parser.builder(options).build();

    /**
     * markdown html 解析器
     */
    private static final HtmlRenderer HTML_RENDER = HtmlRenderer.builder(options).build();

    /**
     * markdown转html
     *
     * @param md markdown字符串
     * @return html字符串
     */
    public static String mdToHtml(String md) {
        if (StringUtils.isEmpty(md)) {
            return "";
        }
        Node document = PARSER.parse(md);
        return HTML_RENDER.render(document);
    }


    /**
     * 忽略大小写的indexOf
     *
     * @param str  被匹配的字符串
     * @param flag 匹配字符串
     * @return 所在的位置, 没有匹配返回-1
     */
    public static int ignoreCaseIndexOf(String str, String flag) {
        str = str.toUpperCase();
        flag = flag.toUpperCase();
        return str.indexOf(flag);
    }

    /**
     * 获取文章预览
     *
     * @return 截取的预览字符串
     */
    public static String getPreView(String content) {
        int index = content.length() > BlogConst.MAX_PREVIEW_COUNT ? BlogConst.MAX_PREVIEW_COUNT : content.length();
        return content.substring(0, index);
    }

    /**
     * 文章内容转为html
     *
     * @param article 文章实体类
     */
    public static void transformContent(Articles article) {
        String html = MarkDownUtil.mdToHtml(article.getContent());
        article.setContent(html);
    }

    /**
     * 文章内容转为预览html
     *
     * @param article 文章实体类
     */
    public static void transformPreView(Articles article) {
        String html = MarkDownUtil.mdToHtml(MarkDownUtil.getPreView(article.getContent()));
        article.setContent(html);
    }
}
